/* * Copyright (C) 2014 IUH �yber$oft Team * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package vn.cybersoft.obs.android.provider; import java.util.LinkedList; import java.util.List; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.support.v4.content.CursorLoader; /** * @author Luan Vu (hlvu.cybersoft@gmail.com) * */ public class PowerSchedule implements Parcelable, DataProviderApi.PowerSchedulesColumns { public static final String EXECUTE_SCHEDULE_ACTION = "vn.cybersoft.obs.android.intent.action.EXECUTE_POWER_SCHEDULE"; public static final String EXTRA_ID = "power_schedule_id"; // This string is used when passing an schedules object through an intent. public static final String INTENT_EXTRA = "intent.extra.schedule"; /** * schedule start with an invalid id when it hasn't been saved to the database. */ public static final long INVALID_ID = -1; // Used when filtering enabled schedules. public static final String WHERE_ENABLED = ENABLED + "=1"; public static final String[] QUERY_COLUMNS = { _ID, BATTERY_LEVEL, ENABLED, MODE_ID }; /** * The default sort order for this table */ public static final String DEFAULT_SORT_ORDER = BATTERY_LEVEL + " ASC"; /** * These save calls to cursor.getColumnIndexOrThrow() * THEY MUST BE KEPT IN SYNC WITH ABOVE QUERY COLUMNS */ public static final int ID_INDEX = 0; public static final int LEVEL_INDEX = 1; public static final int ENABLED_INDEX = 2; public static final int MODE_ID_INDEX = 3; private static final int COLUMN_COUNT = MODE_ID_INDEX + 1; private static ContentValues createContentValues(PowerSchedule schedule) { ContentValues values = new ContentValues(COLUMN_COUNT); values.put(BATTERY_LEVEL, schedule.level); values.put(ENABLED, schedule.enabled ? 1 : 0); values.put(MODE_ID, schedule.modeId); return values; } public static Uri getUri(long id) { return ContentUris.withAppendedId(CONTENT_URI, id); } public static long getId(Uri contentUri) { return ContentUris.parseId(contentUri); } public static CursorLoader getCursorLoader(Context context) { return new CursorLoader(context, CONTENT_URI, QUERY_COLUMNS, null, null, DEFAULT_SORT_ORDER); } /** * Creates a new time schedule and fills in the given schedule's id. */ public static PowerSchedule addSchedule(ContentResolver contentResolver, PowerSchedule schedule) { ContentValues values = createContentValues(schedule); Uri uri = contentResolver.insert(CONTENT_URI, values); schedule.id = getId(uri); return schedule; } public static boolean updateSchedule(ContentResolver contentResolver, PowerSchedule schedule) { if (schedule.id == OptimalMode.INVALID_ID) return false; ContentValues values = createContentValues(schedule); long rowsUpdated = contentResolver.update(getUri(schedule.id), values, null, null); return rowsUpdated == 1; } public static boolean deleteSchedule(ContentResolver contentResolver, long scheduleId) { if (scheduleId == OptimalMode.INVALID_ID) return false; int deletedRows = contentResolver.delete(getUri(scheduleId), "", null); return deletedRows == 1; } public static PowerSchedule getSchedule(ContentResolver contentResolver, long id) { Cursor cursor = contentResolver.query(getUri(id), QUERY_COLUMNS, null, null, null); PowerSchedule result = null; if (cursor == null) { return result; } try { if (cursor.moveToFirst()) { result = new PowerSchedule(cursor); } } finally { cursor.close(); } return result; } public static List<PowerSchedule> getSchedules(ContentResolver contentResolver, String selection, String ... selectionArgs) { Cursor cursor = contentResolver.query(CONTENT_URI, QUERY_COLUMNS, selection, selectionArgs, null); List<PowerSchedule> result = new LinkedList<PowerSchedule>(); if (cursor == null) { return result; } try { if (cursor.moveToFirst()) { do { result.add(new PowerSchedule(cursor)); } while (cursor.moveToNext()); } } finally { cursor.close(); } return result; } public static void enableSchedule(final ContentResolver contentResolver, final long id, boolean enabled) { PowerSchedule schedule = getSchedule(contentResolver, id); if (schedule == null) { return; } ContentValues values = new ContentValues(2); values.put(ENABLED, enabled ? 1 : 0); contentResolver.update(getUri(id), values, null, null); } public static final Parcelable.Creator<TimeSchedule> CREATOR = new Parcelable.Creator<TimeSchedule>() { @Override public TimeSchedule createFromParcel(Parcel p) { return new TimeSchedule(p); } @Override public TimeSchedule[] newArray(int size) { return new TimeSchedule[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel p, int flags) { p.writeLong(id); p.writeInt(enabled ? 1 : 0); p.writeInt(level); p.writeLong(modeId); } public long id; public int level; public boolean enabled; public long modeId; public PowerSchedule(Cursor c) { id = c.getLong(ID_INDEX); level = c.getInt(LEVEL_INDEX); enabled = c.getInt(ENABLED_INDEX) >= 1; modeId = c.getLong(MODE_ID_INDEX); } public PowerSchedule() { id = -1; enabled = true; modeId = -1; } @Override public int hashCode() { return Long.valueOf(id).hashCode(); } @Override public boolean equals(Object o) { if (!(o instanceof PowerSchedule)) return false; final PowerSchedule other = (PowerSchedule) o; return id == other.id; } @Override public String toString() { return "PowerSchedule{" + ", id=" + id + ", level=" + level + ", enabled=" + enabled + ", modeId=" + modeId + '}'; } }